Label[I]

Tags:    delphi

Mit problem er følgene:

Jeg er igang med at lave et slange spil.
Slangen består af en række labels der følger efter hinanden.
Man bliver en Label længere for hver klods man tager.
Lige nu er er der en max. længde på 50 Labels,
men jeg vil gerne lave den evig lang med .Create.
Jeg har en integer med antal af Labels.
Jeg vil så gerne flytte slangen med en for sætning:

for I := AntalLabels downto 2 do
begin
J := I - 1;
Label[I].Left := Label[J].Left;
Label[I].Top := Label[J].Top;
end;

FlytLabel1;

Hvordan gør jeg det?

Emil Melgaard
emil.melgaard@private.dk



7 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 5 karma
Sorter efter stemmer Sorter efter dato
<quote>Mit problem er følgene:

Jeg er igang med at lave et slange spil.
Slangen består af en række labels der følger efter hinanden.
Man bliver en Label længere for hver klods man tager.
Lige nu er er der en max. længde på 50 Labels,
men jeg vil gerne lave den evig lang med .Create.
Jeg har en integer med antal af Labels.
Jeg vil så gerne flytte slangen med en for sætning:

for I := AntalLabels downto 2 do
begin
J := I - 1;
Label[I].Left := Label[J].Left;
Label[I].Top := Label[J].Top;
end;

FlytLabel1;
</quote>

Hvis jeg var dig ville jeg nok bruge en TList til at holde styr på dine labels. Hver gang man 'spiser' en klods siger du så bare noget i stil med:

DinTList.Add(TLabel.Create(Form1);
TLabel(DinTList.Items[DinTlist.Count - 1]).Left := x;
TLabel(DinTList.Items[DinTlist.Count - 1]).Top := y;

Det vil give dig mulighed for at gøre slangen evig lang. Når du så skal flytte den bliver det noget i stil med:


TLabel(DinTList.Items[DinTlist.Count - 1]).Top := TLabel(DinTList.Items[DinTlist.Count - 1]).Top + 20; //flyt den forreste klods lidt op
for i := 0 to DinTList.Count - 2 do
begin
TLabel(DinTList.Items).Left := TLabel(DinTList.Items[i + 1]).Left;
TLabel(DinTList.Items).Top := TLabel(DinTList.Items[i + 1]).Top;
end;




Hej Emil...

Var det ikke nemmere/smartere at tegne din slange direkte på formen, altså uden brug af labels? Jeg har selv leget med det på et tidspunkt, og det er faktisk ikke overdrevet svært. Min slange bestod bare af * tegn, men det kan du jo selv bestemme. Ved at tegne et antal * tegn lige efter hinanden, kan du så selv bestemme hvor lang slangen skal være, og når den rykker sig, fx fra venstre mod højre, så sætter du bare nye tegn, og overskriver de gamle! Håber det kan bruges til et eller andet :-)

--
Mvh.

Kasper (TSW)
Webmaster



<quote>Hej Emil...

Var det ikke nemmere/smartere at tegne din slange direkte på formen, altså uden brug af labels? Jeg har selv leget med det på et tidspunkt, og det er faktisk ikke overdrevet svært. Min slange bestod bare af * tegn, men det kan du jo selv bestemme. Ved at tegne et antal * tegn lige efter hinanden, kan du så selv bestemme hvor lang slangen skal være, og når den rykker sig, fx fra venstre mod højre, så sætter du bare nye tegn, og overskriver de gamle! Håber det kan bruges til et eller andet :-)

--
Mvh.

Kasper (TSW)
Webmaster</quote>

Jeg vil helst selv bestemme hvordan min slange ser ud,
hovedet er fx. rødt og senere vil jeg erstatte Labelerne med Images.
Det ser det lidt underligt ud med en slange af *: ***************.
Desuden vil jeg også bruge det til andre programmer.

Emil Melgaard
emil.melgaard@private.dk



<quote> Hvis jeg var dig ville jeg nok bruge en TList til at holde styr på dine labels. Hver gang man 'spiser' en klods siger du så bare noget i stil med:

DinTList.Add(TLabel.Create(Form1);
TLabel(DinTList.Items[DinTlist.Count - 1]).Left := x;
TLabel(DinTList.Items[DinTlist.Count - 1]).Top := y;

Det vil give dig mulighed for at gøre slangen evig lang. Når du så skal flytte den bliver det noget i stil med:


TLabel(DinTList.Items[DinTlist.Count - 1]).Top := TLabel(DinTList.Items[DinTlist.Count - 1]).Top + 20; //flyt den forreste klods lidt op
for i := 0 to DinTList.Count - 2 do
begin
TLabel(DinTList.Items).Left := TLabel(DinTList.Items[i + 1]).Left;
TLabel(DinTList.Items).Top := TLabel(DinTList.Items[i + 1]).Top;
end;</quote>

Det virker ikke, når jeg compiler siger den: Undeclared identifier: 'TLabel'.
Hvad har jeg gjort forkert?

Emil Melgaard
emil.melgaard@private.dk




<quote>
Det virker ikke, når jeg compiler siger den: Undeclared identifier: 'TLabel'.
Hvad har jeg gjort forkert?
</quote>

Du har måske glemt at tilføje StdCtrls til uses?




<quote>
Det virker ikke, når jeg compiler siger den: Undeclared identifier: 'TLabel'.
Hvad har jeg gjort forkert?


Du har måske glemt at tilføje StdCtrls til uses?
</quote>

Nu kommer der en meddelelse hvor der står:

Project Project1.exe raised exception class EAccessViolation with message 'Access violation at adress 0040C907 in module 'PROJECT1.EXE'. Read of adress FFFFFFFF'. Process stopped. Use Step or Run to continue.

Emil Melgaard
emil.melgaard@private.dk



<quote>
Nu kommer der en meddelelse hvor der står:

Project Project1.exe raised exception class EAccessViolation with message 'Access violation at adress 0040C907 in module 'PROJECT1.EXE'. Read of adress FFFFFFFF'. Process stopped. Use Step or Run to continue.
</quote>

Jeg har ikke lige testet koden, men den access violation kommer fordi du forsøger at tilgå et objekt der ikke eksistere. Har du husket at oprette DinTList med DinTList := TList.Create;?




t